﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Imports System
''' <summary>
''' Fuehrt einen Angriff aus und zeigt ihn bei Animationen an.
''' </summary>
''' <remarks></remarks>
Public Class ObjektAngriff
    Public Shared ProzentualeSternAuffuellung As Integer = 1000
    Dim Start As Boolean = False
    Dim Angreifer As ObjektEinheit
    Dim AngreiferX As Integer
    Dim AngreiferY As Integer
    Dim Verteidiger As ObjektEinheit
    Dim VerteidigerX As Integer
    Dim VerteidigerY As Integer
    Dim VerteidigerLandschaft As ObjektLandschaft
    Dim AngreiferWaffe() As Single = {}
    Dim VerteidigerWaffe() As Single = {}
    Dim neuesVerteidigerLeben As Single
    Dim neuesAngreiferLeben As Single
    Dim MaxFrames As Integer = 0
    Dim Fernkampf As Boolean
    Dim AngreiferSchaden As Single = 0
    Dim VerteidigerSchaden As Single = 0
    Dim Kampfende As Boolean = False
    Public Kampfani As KampfAnimation
    Dim InstantBattle As Boolean = False
    Public Sub New(ByVal neuAngreiferX As Integer, ByVal neuAngreiferY As Integer, ByVal AngreiferLandschaft As ObjektLandschaft, ByVal neuVerteidigerX As Integer, ByVal neuVerteidigerY As Integer, ByVal Fernkampf As Boolean, ByVal neuAngreiferWaffe As Single(), ByVal neuVerteidigerWaffe As Single(), Optional ByVal KeineAnimationen As Boolean = False, Optional ByVal InstandBattle As Boolean = False)
        Start = False
        Me.InstantBattle = InstandBattle
        Select Case DataSettings.CommanderWarsGameModus
            Case CommanderWarsGameModi.AdvanceWars
                ProzentualeSternAuffuellung = 900
            Case CommanderWarsGameModi.AdvanceWars2
                ProzentualeSternAuffuellung = 900
            Case CommanderWarsGameModi.AdvanceWarsDS
                ProzentualeSternAuffuellung = 800
            Case CommanderWarsGameModi.CommanderWars2
                ProzentualeSternAuffuellung = 750
            Case Else
                ProzentualeSternAuffuellung = 1000
        End Select

        'wir schreiben die Variablen in die Werte geschrieben
        Me.Fernkampf = Fernkampf
        AngreiferX = neuAngreiferX
        AngreiferY = neuAngreiferY
        Angreifer = Objektverwalter.Spielfeld.Einheiten(AngreiferX, AngreiferY, ObjektSpielfeld.Bodenschlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Objektverwalter.Spielfeld.AktuelleEinheit
        End If
        AngreiferWaffe = neuAngreiferWaffe
        VerteidigerX = neuVerteidigerX
        VerteidigerY = neuVerteidigerY
        Verteidiger = Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht)
        VerteidigerWaffe = neuVerteidigerWaffe
        Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
        Objektverwalter.Spielfeld.EingabenErlauben = False
        Objektverwalter.Spielfeld.KIPause = True
        'Wir setzen das neue Leben von Angreifer und Verteidiger fest
        If IsNothing(Verteidiger) = False Then
            neuesVerteidigerLeben = Verteidiger.Leben - AngreiferWaffe(0)
            If neuesVerteidigerLeben < 0 Then
                neuesVerteidigerLeben = 0
            End If
            neuesAngreiferLeben = Angreifer.Leben
            'wir legen den Verteidiger Schaden fest
            VerteidigerSchaden = Verteidiger.Leben - neuesVerteidigerLeben
            'So falls der Angreifer eine Raub staerke hat wird im Geld gegeben
            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Geldraub > 0 Then
                Dim Geld As Integer = Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY) / 10 * getKP(Verteidiger.Leben - neuesVerteidigerLeben) * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Geldraub * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(Angreifer)
                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).AddFonds(Geld)
            End If

            If Fernkampf = False And IsNothing(VerteidigerWaffe) = False Then
                If VerteidigerWaffe(0) >= 0 Then
                    neuesAngreiferLeben = Angreifer.Leben - VerteidigerWaffe(0)
                Else
                    neuesAngreiferLeben = Angreifer.Leben
                End If
                If neuesAngreiferLeben < 0 Then
                    neuesAngreiferLeben = 0
                End If
                'Wir setzen den Angreiferschaden fest
                AngreiferSchaden = Angreifer.Leben - neuesAngreiferLeben
                'So falls der Verteidiger eine Raubstaerke hat wird sie eingesetzt
                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Geldraub > 0 Then
                    Dim Geld As Integer = Angreifer.Kosten * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Teurungsrate(Angreifer, AngreiferX, AngreiferY) / 10 * getKP(Angreifer.Leben - neuesAngreiferLeben) * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Geldraub
                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).AddFonds(Geld)
                End If


            End If
            'Wir ziehen dem Verteidiger Munition ab.
            If IsNothing(VerteidigerWaffe) = False Then
                If VerteidigerWaffe(1) = 2 Then
                    Verteidiger.Munition = -1
                End If
            End If
        Else
            'Wir waehlen die Landschaft oder Gebaeude mit Leben aus
            VerteidigerLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, ObjektSpielfeld.Bodenschlacht)
        End If
        'Falls wir mit der zweiten Waffe angreifen wird die Munition verringert
        If AngreiferWaffe(1) = 2 Then
            If Objektverwalter.Spielfeld.AktuelleEinheit IsNot Nothing Then
                Objektverwalter.Spielfeld.AktuelleEinheit.Munition = -1
            Else
                Angreifer.Munition = -1
            End If
        End If
        'wir wuerden gegen ein Gebaeude Kaempfen da gibt es keine Sprites
        If IsNothing(Verteidiger) Then
            MaxFrames = -1
            Kampfende = True
        Else
            If KeineAnimationen = False And InstandBattle = False Then
                Select Case DataSettings.KampfAnimationen
                    Case KampfanimationsTypen.Alle
                        Kampfani = New KampfAnimation(Angreifer, Verteidiger, AngreiferSchaden, VerteidigerSchaden, Fernkampf)
                    Case KampfanimationsTypen.Eigene
                        If Angreifer.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Or Verteidiger.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                            Kampfani = New KampfAnimation(Angreifer, Verteidiger, AngreiferSchaden, VerteidigerSchaden, Fernkampf)
                        Else
                            Kampfende = False
                        End If
                    Case KampfanimationsTypen.Feindliche
                        If Angreifer.GetSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Or Verteidiger.GetSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                            Kampfani = New KampfAnimation(Angreifer, Verteidiger, AngreiferSchaden, VerteidigerSchaden, Fernkampf)
                        Else
                            Kampfende = False
                        End If
                    Case KampfanimationsTypen.Keine
                        Kampfende = True
                    Case Else
                        Kampfende = True
                End Select
            End If
        End If
        If DataSettings.draw3D And InstandBattle = False Then
            Dim APos As Point
            If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                APos = New Point(AngreiferX, AngreiferY)
            Else
                APos = Objektverwalter.Spielfeld.Laufen.Position
            End If
            Angreifer.SetOrientation(APos, New Point(VerteidigerX, VerteidigerY))
            If Verteidiger IsNot Nothing Then
                Verteidiger.SetOrientation(APos)
            End If
            'Na dann koennen die Einheiten ja jetzt anfangen zu kaempfen.
            Angreifer.SetAnimation(ObjektEinheit.AnimationSets3D.Fight.ToString)
            Angreifer.SetFolgeAnimation(ObjektEinheit.AnimationSets3D.Fight.ToString)
            If Not Verteidiger Is Nothing Then
                Verteidiger.SetAnimation(ObjektEinheit.AnimationSets3D.Fight.ToString)
                Verteidiger.SetFolgeAnimation(ObjektEinheit.AnimationSets3D.Fight.ToString)
            End If
        End If
        If InstandBattle Then
            If Verteidiger IsNot Nothing Then
                Verteidiger.HatsichBewegt = True
            End If
            Angreifer.HatsichBewegt = True
            AngriffEnde()
        Else
            Start = True
        End If
    End Sub

    Public Function Malen() As Boolean
        If InstantBattle Then
            Return True
        Else
            If Hauptmenue.Aufzeichnungsspulen Then
                Return True
            Else
                If Start = True Then
                    Grafikengine.szfScale = Nothing

                    If Kampfende = False Then
                        If Kampfani IsNot Nothing Then
                            Kampfende = Kampfani.Malen
                        Else
                            Kampfende = True
                        End If
                    End If

                    If Kampfende = True Then
                        Return True
                    End If
                End If
            End If
        End If
    End Function
    Public Sub AngriffEnde()
        If Not InstantBattle Then
            If DataSettings.draw3D Then

                'Die Einheiten koennen jetzt aufhoeren zu kaempfen.
                Angreifer.AnimationAktuallisieren()
                If Verteidiger IsNot Nothing Then
                    Verteidiger.AnimationAktuallisieren()
                End If
            End If
        End If
        If Start = True Or InstantBattle Then
            'wir ziehen dem Verteidiger das Leben ab.
            If IsNothing(Verteidiger) Then
                If IsNothing(VerteidigerLandschaft.Gebaeude) Then
                    VerteidigerLandschaft.Leben = -CInt(AngreiferWaffe(0))
                    If VerteidigerLandschaft.Leben <= 0 Then
                        'Die Landschaft wurde zerstoert
                        Dim Explosion As String = "Land"
                        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht)
                        'ein Meteor Plasma kaputt machen
                        If Landschaft.LandschaftsID = "METEOR" Then
                            LandschaftsTexturMeteor.DestroyPlasma(Landschaft.KooX, Landschaft.KooY)
                        ElseIf Landschaft.LandschaftsID = "W_METEOR" Then
                            LandschaftsTexturW_Meteor.DestroyPlasma(Landschaft.KooX, Landschaft.KooY)
                        ElseIf Landschaft.LandschaftsID = "S_METEOR" Then
                            LandschaftsTexturS_Meteor.DestroyPlasma(Landschaft.KooX, Landschaft.KooY)
                        End If
                        Dim NeuLandschaft As String = Landschaft.WirdZu
                        If Landschaft.TerrainUntergrundID >= 0 Then
                            NeuLandschaft = Objektverwalter.LandschaftenBilder(Landschaft.TerrainUntergrundID).ID
                        End If
                        If NeuLandschaft IsNot Nothing Then
                            Select Case NeuLandschaft.ToUpper
                                Case "EBENE"
                                    NeuLandschaft += "+SCHROTT"
                                Case "WUESTE"
                                    NeuLandschaft += "+SCHROTT"
                                Case "SCHNEE"
                                    NeuLandschaft += "+SCHROTT"
                            End Select
                            Objektverwalter.NeuObjektAnimation(New Point(VerteidigerX, VerteidigerY), Explosion, Objektverwalter.Spielfeld.MomentaneSchlacht)
                            Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(NeuLandschaft, VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld, )
                        Else
                            Konsole.Write("Internal Unit or Terrain Error couldn't detect current Deffender.")
                            Exit Sub
                        End If
                    End If
                Else
                    VerteidigerLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerLandschaft.Gebaeude.Rechteck.X, VerteidigerLandschaft.Gebaeude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    VerteidigerLandschaft.Gebaeude.KP -= CInt(AngreiferWaffe(0))
                    If VerteidigerLandschaft.Gebaeude.GetKP(VerteidigerY, VerteidigerY, True) <= 0 Then
                        Dim X As Integer = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.X
                        Dim Y As Integer = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Rechteck.Y
                        'Wir haben das Gebaeude zerstoert
                        'Die Landschaft wurde zerstoert
                        Dim Explosion As String = "Land"

                        Objektverwalter.NeuObjektAnimation(New Point(X, Y), Explosion, Objektverwalter.Spielfeld.MomentaneSchlacht, True)
                        'wir erstellen die Landschaft die jetzt erscheint.
                        If ObjektLadeklasse.NewGebaeude(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.WirdZu, 0, -1, -1) IsNot Nothing Then
                            Dim D(,) As Integer = VerteidigerLandschaft.Gebaeude.Verweisgebaeude
                            For I = 0 To D.GetLength(0) - 1
                                If Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.GetRealGebaeudeID = "VERWEIS" Then
                                    Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = Nothing
                                End If
                            Next
                            Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.WirdZu, Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.Spieler, X, Y)
                        Else
                            Dim D(,) As Integer = VerteidigerLandschaft.Gebaeude.Verweisgebaeude
                            Dim ID As String = VerteidigerLandschaft.LandschaftsID + "+SCHROTT"
                            If VerteidigerLandschaft.LandschaftsID.Contains("+") = True Then
                                ID = VerteidigerLandschaft.LandschaftsID
                            End If
                            For I = 0 To D.GetLength(0) - 1
                                If Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude.GetRealGebaeudeID = "VERWEIS" Then
                                    Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = Nothing
                                    Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(ID, X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld, )
                                End If
                            Next
                            Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(ID, VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld, )
                        End If
                    End If
                End If

            Else
                'Aufzeichnungen abspeichern!
                If Not InstantBattle Then
                    Objektverwalter.Spielfeld.Aufzeichnung.UpdateAngriff(AngreiferWaffe(0), Angreifer.Spieler)
                End If
                'Muaha
                Verteidiger.Leben = neuesVerteidigerLeben
                'Der Gegner schiesst zurueck bzw. wir bekommen Leben zurueck
                Angreifer.Leben = neuesAngreiferLeben
                If Verteidiger.Leben < 0 Then
                    Verteidiger.Leben = 0
                End If
                'Der Lebensentzug des Angreifers wirkt
                Angreifer.IncreaseLeben(VerteidigerSchaden * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Lebensentzug * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY))
                'Manche KOS haben die Faehigkeit Gegner daran zu hindern sich zu heilen
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ReperaturVerbotNachKampf = True Then
                    If Angreifer.GetSpieler.KOS(0).KOBoostApply(AngreiferX, AngreiferY) Then
                        Verteidiger.KannReapariertWerden = False
                    End If
                End If
                'Manche Spieler erhalten Geld fuer Schaden an eigenen Truppen.
                'Falls der Angreifer eine Geld fuer Schaden bekommt erhaelt er dieses jetzt
                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).GeldFuerEigenSchaden > 0 Then
                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).AddFonds(Verteidiger.Kosten * VerteidigerSchaden / 100 * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).GeldFuerEigenSchaden * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY))
                End If
                'So jetzt berechnen wir die Gabeleisten auffuellung
                Dim SternSchaden As Single = VerteidigerSchaden
                GabeleistenAuffuellen(SternSchaden)
                If Verteidiger.Leben > 0 Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStaerke.Y < VerteidigerSchaden And Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStaerke.X <> 0 Then
                        'Die Radioaktive Seuche wird uebertragen
                        Dim RadioZahl As Integer = Math.DivRem(CInt(VerteidigerSchaden), Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStaerke.Y, 0) * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                        Verteidiger.IncreaseRadioaktiveVerseuchung(RadioZahl * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStaerke.X)
                    End If
                    If Fernkampf = False Then
                        'Falls der Angreifer eine Geld fuer Schaden bekommt erhaelt er dieses jetzt
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).GeldFuerEigenSchaden > 0 Then
                            Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).AddFonds(Angreifer.Kosten * AngreiferSchaden / 100 * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).GeldFuerEigenSchaden * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY))
                        End If
                        'Aber zuvor erhaelt er noch KP mit Lebensentzug
                        Verteidiger.IncreaseLeben(AngreiferSchaden * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Lebensentzug * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY))
                        'Wenn der Verteidiger noch lebt kann es sein das er wegfliegt.
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Schadensflug.X <= AngreiferWaffe(0) Then
                            Schadensflug(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Schadensflug.Y * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY), Verteidiger, True)
                        End If
                    End If
                End If
                'Falls wir einen gewissen Schaden ueberschreiten kann sich unser Feind nicht mehr bewegen.
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Laehmschaden * 10 * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY) >= Verteidiger.Leben Then
                    Verteidiger.HatsichBewegt = True
                End If
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ParalyzeDamage >= 0 Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ParalyzeDamage * 10 / Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY) <= VerteidigerSchaden Then
                        Verteidiger.HatsichBewegt = True
                    End If
                End If

                'Falls der Verteidiger kein Leben mehr hat wird er zerstoert
                If Verteidiger.Leben <= 0 Then
                    If Angreifer.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Hauptmenue.User.UnitDestroyed(Verteidiger.EinheitenID)
                    End If

                    Verteidiger.GetSpieler.RemoveEinheit(Verteidiger)
                    'Haben wir die KO Einheit zerstoert?
                    Dim S As ObjektSpieler = Verteidiger.GetSpieler
                    If Not S.KOS(0).GetKOUnit Is Nothing Then
                        If Verteidiger.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                            S.KOS(0).SetKOEinheit(Nothing)
                        End If
                    End If
                    'Die Einheit steigt im Rang auf.
                    If Objektverwalter.Spielfeld.Regeln.LevelModus = True Then
                        Angreifer.EinheitenStufe = 1
                    End If
                    'Manche KOs setzen die Bewegungspunkte nach Zerstoerung auf einen Wert fuer eine Runde.
                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).BewegungspunkteFestlegen(VerteidigerX, VerteidigerY)
                    'Manche KOs haben den Vorteil durch Zerstoerung andere Truppen zu verbessern.
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AnyUnitKampfverstaerker.X <> 0 Or Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AnyUnitKampfverstaerker.Y <> 0 Then
                        Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).IncreaseAnyUnitATKandMovementPointsNachZerstoerung(AngreiferX, AngreiferY)
                    End If
                    'Wir erleiden Schaden
                    Angreifer.DoDamage(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KampfSchadenHeilung * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY))
                    'unsere Deffensive und Offensive steigt
                    Angreifer.ATKDEFBoost.Y += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ATKDEFBoostdurchZerstoerung.Y * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    Angreifer.ATKDEFBoost.X += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ATKDEFBoostdurchZerstoerung.X * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                    'Und die ausgewaehlte Einheit darf warten auf ihre Zerstoerung. Haha
                    If Not InstantBattle Then
                        UnitDestroyed(Verteidiger.Spieler, Angreifer.Spieler)
                    End If
                    Objektverwalter.NeuObjektAnimation(Verteidiger.X, Verteidiger.Y)
                    'So hier wurde die Besetzungszahl bereits Reseted jetzt koennen wir sie senken falls der KO so eine Faehigkeit hat.
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).BesetzungsbonusNachEinheitenZerstoerung < 0 Then
                        Dim Gebaeude As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                        If Not Gebaeude Is Nothing Then
                            If Gebaeude.Besetzung > 0 Then
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AddBonusgebaeude(New Point(VerteidigerX, VerteidigerY), AngreiferX, AngreiferY)
                            End If
                        End If
                    End If
                ElseIf IsNothing(VerteidigerWaffe) = False Then
                    'wir ziehen dem Angreifer Leben ab.
                    If VerteidigerWaffe(0) >= 0 Then
                        'Der Lebensentzug des Angreifers wirkt
                        Verteidiger.IncreaseLeben(AngreiferSchaden * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Lebensentzug * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY))
                        'und er erhaelt auch noch ein paar TP zurueck.
                        Verteidiger.DoDamage(-Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KampfSchadenHeilung * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY))
                        If Angreifer.Leben > 0 Then
                            If Fernkampf = False Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Schadensflug.X <= VerteidigerWaffe(0) Then
                                    Schadensflug(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Schadensflug.Y * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY), Angreifer, False)
                                End If
                            End If
                        End If
                        If Angreifer.Leben <= 0 Then
                            If Verteidiger.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                Hauptmenue.User.UnitDestroyed(Angreifer.EinheitenID)
                            End If

                            Angreifer.GetSpieler.RemoveEinheit(Angreifer)
                            'Ist der Angreifer KO zerstoert?
                            Dim S As ObjektSpieler = Angreifer.GetSpieler
                            If Not S.KOS(0).GetKOUnit Is Nothing Then
                                If Angreifer.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                    S.KOS(0).SetKOEinheit(Nothing)
                                End If
                            End If

                            'Die Einheit steigt im Rang auf.
                            If Objektverwalter.Spielfeld.Regeln.LevelModus = True Then
                                Verteidiger.EinheitenStufe = 1
                            End If
                            'So hier wurde die Besetzungszahl bereits Reseted jetzt koennen wir sie senken falls der KO so eine Faehigkeit hat.
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).BesetzungsbonusNachEinheitenZerstoerung < 0 Then
                                Dim Gebaeude As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(AngreiferX, AngreiferY, ObjektSpielfeld.Bodenschlacht).Gebaeude
                                If Not Gebaeude Is Nothing Then
                                    If Gebaeude.Besetzung > 0 Then
                                        Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).AddBonusgebaeude(New Point(AngreiferX, AngreiferY), VerteidigerX, VerteidigerY)
                                    End If
                                End If
                            End If
                            'Manche KOs setzen die Bewegungspunkte nach Zerstoerung auf einen Wert fuer eine Runde.
                            Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).BewegungspunkteFestlegen(AngreiferX, AngreiferY)
                            'wir reisen unseren Gegner in den Tod.
                            Verteidiger.DoDamage(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).KampfSchadenHeilung * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY))
                            'Wir wurden zerstoert und Boom
                            If Not InstantBattle Then
                                UnitDestroyed(Angreifer.Spieler, Verteidiger.Spieler)
                            End If
                            Objektverwalter.NeuObjektAnimation(AngreiferX, AngreiferY)
                            If Not InstantBattle Then
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    Objektverwalter.Spielfeld.EingabenErlauben = True
                                    ObjektMaus.Visible = True
                                End If
                                Objektverwalter.Spielfeld.KIPause = False
                                Objektverwalter.Spielfeld.AktuelleEinheitPosition = Nothing
                                Objektverwalter.Spielfeld.Wegsuchsystem = Nothing
                                Objektverwalter.Spielfeld.AktuelleEinheitPfeil = Nothing
                                Objektverwalter.Spielfeld.AktuelleEinheitHatGefeuert = False
                                Objektverwalter.Spielfeld.Sichterstellen()
                                Dim M As ObjektSpielMenue = Objektverwalter.Menue
                                M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
                            End If
                            Exit Sub
                        Else
                            Angreifer.DoDamage(-Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).KampfSchadenHeilung)
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStaerke.Y < AngreiferSchaden And Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStaerke.X <> 0 Then
                                'Die Radioaktive Seuche wird uebertragen
                                Dim RadioZahl As Integer = Math.DivRem(CInt(AngreiferSchaden), Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStaerke.Y, 0) * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY)
                                Verteidiger.IncreaseRadioaktiveVerseuchung(RadioZahl * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStaerke.X)
                            End If
                        End If
                        If Not InstantBattle Then
                            Objektverwalter.Spielfeld.AktuelleEinheit = Angreifer
                        Else
                            Objektverwalter.Spielfeld.Einheiten(Angreifer.X, Angreifer.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Angreifer
                        End If
                        Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht) = Verteidiger
                    End If
                End If
            End If
            If Not InstantBattle Then
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).NochMalZiehenUndKampfaenderNachZerstoerung <> 0 And neuesVerteidigerLeben <= 0 Then
                    'Wir haben einen Feind zerstoert und koennen deshalb nochmal ziehen.
                    If Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY) > 0 Then
                        Objektverwalter.Spielfeld.AktuelleEinheit.ATKDEFBoost.X += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).NochMalZiehenUndKampfaenderNachZerstoerung * Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY)
                        Objektverwalter.WartenOhneHatSichBewegt()
                    Else
                        Objektverwalter.Warten()
                    End If
                Else
                    Objektverwalter.Warten()
                End If
            End If
            If Not InstantBattle Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Objektverwalter.Spielfeld.EingabenErlauben = True
                    ObjektMaus.Visible = True
                End If
                Objektverwalter.Spielfeld.KIPause = False
            End If
        End If
    End Sub


    ''' <summary>
    ''' So wird die Gabeleiste der Einheiten gefuellt
    ''' </summary>
    ''' <param name="Schaden"></param>
    ''' <remarks></remarks>
    ''' 
    Public Sub GabeleistenAuffuellen(ByVal Schaden As Single)
        If Not InstantBattle Then
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.AdvanceWarsDS
                    ProzentualeSternAuffuellung = 6
                Case CommanderWarsGameModi.AdvanceWars2, CommanderWarsGameModi.AdvanceWars
                    ProzentualeSternAuffuellung = 9
                Case Else
                    ProzentualeSternAuffuellung = 15
            End Select
            Select Case Objektverwalter.Spielfeld.Regeln.KOSystem
                Case KOSysteme.KO_Modus
                    'Angreifer Balken aufladen
                    If Angreifer.GetSpieler.KOS(0).GetKOZoneBoost(AngreiferX, AngreiferY) > 0 Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                        GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                                    ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                        GabeVoll = ObjektKO.Gabemodi.Gabe
                                    End If
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Math.DivRem(CInt(Schaden), 10, 0) * 100
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFuellMusik(GabeVoll)
                                End If
                            End If
                        End If
                    End If
                    'Verteidger Leiste auffuellen
                    If Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY) > 0 Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Math.DivRem(CInt(AngreiferSchaden), 10, 0) * 100
                                End If
                            End If
                        End If
                    End If
                Case KOSysteme.CoW_Hybrid
                    Dim Sternbonus As Integer = Schaden / 100 * (Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY)) / ProzentualeSternAuffuellung * 1.5
                    'Jetzt werden die Gabeleisten gefuellt ,aber nur wenn der KO nicht gerade seine Gabe bzw. Spezialgabe einsetzt
                    If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Sternbonus * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY)
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabeleiste = Sternbonus / 2 * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY)
                                End If
                            End If
                        End If
                    End If
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                                ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Gabe
                                End If
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Sternbonus * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY)
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFuellMusik(GabeVoll)
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabeleiste = Sternbonus * Verteidiger.GetSpieler.KOS(0).GetKOZoneBoost(VerteidigerX, VerteidigerY)
                                End If
                            End If
                        End If
                    End If
                Case Else
                    Dim Sternbonus As Integer = Schaden / 100 * (Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY)) / ProzentualeSternAuffuellung
                    'Jetzt werden die Gabeleisten gefuellt ,aber nur wenn der KO nicht gerade seine Gabe bzw. Spezialgabe einsetzt
                    If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Sternbonus
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabeleiste = Sternbonus / 2
                                End If
                            End If
                        End If
                    End If
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeraenderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                                ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Gabe
                                End If
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Sternbonus / 2
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFuellMusik(GabeVoll)
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabeleiste = Sternbonus / 4
                                End If
                            End If
                        End If
                    End If
            End Select
        End If
    End Sub
    ''' <summary>
    ''' Laesst den Gegner wegfliegen und richtet evtl. Schaden an.
    ''' </summary>
    ''' <param name="Felder"></param>
    ''' <param name="Einheit"></param>
    ''' <param name="VerteidigerFlug"></param>
    ''' <remarks></remarks>
    Private Sub Schadensflug(ByVal Felder As Integer, ByRef Einheit As ObjektEinheit, ByVal VerteidigerFlug As Boolean)
        If Felder > 0 Then
            Dim EinheitenPosition As New Point(AngreiferX, AngreiferY)
            Dim X As Integer = AngreiferX - VerteidigerX
            Dim Y As Integer = AngreiferY - VerteidigerY
            If VerteidigerFlug = True Then
                X = VerteidigerX - AngreiferX
                Y = VerteidigerY - AngreiferY
                EinheitenPosition = New Point(VerteidigerX, VerteidigerY)
                Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, ObjektSpielfeld.Bodenschlacht) = Nothing
            End If
            Dim Richtung As New Point
            If Math.Abs(X) > Math.Abs(Y) Then
                Richtung.X = X
            Else
                Richtung.Y = Y
            End If
            For I = 1 To Felder
                If Objektverwalter.Spielfeld.OnMap(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y) = True Then
                    If Einheit.CanMoveOverTile(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y, ObjektSpielfeld.Bodenschlacht) = True And Objektverwalter.Spielfeld.Einheiten(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                        EinheitenPosition.X += Richtung.X
                        EinheitenPosition.Y += Richtung.Y
                    Else
                        SchadensflugSchaden(Felder, Einheit, VerteidigerFlug, EinheitenPosition, I)
                        Exit For
                    End If
                Else
                    SchadensflugSchaden(Felder, Einheit, VerteidigerFlug, EinheitenPosition, I)
                    Exit For
                End If
                'Schade kein Lebensabzug
                If I = Felder Then
                    If VerteidigerFlug = True Then
                        VerteidigerX = EinheitenPosition.X
                        VerteidigerY = EinheitenPosition.Y
                    Else
                        AngreiferX = EinheitenPosition.X
                        AngreiferY = EinheitenPosition.Y
                        Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(AngreiferX, AngreiferY)
                        If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            Objektverwalter.Spielfeld.Laufen.Position = New Point(AngreiferX, AngreiferY)
                        End If
                    End If
                End If
            Next
        End If
    End Sub
    Private Sub SchadensflugSchaden(ByVal Felder As Integer, ByRef Einheit As ObjektEinheit, ByVal VerteidigerFlug As Boolean, ByVal EinheitenPosition As Point, ByVal I As Integer)
        Dim Schaden As Integer = Felder - I + 1
        If Einheit.Leben - Schaden * 10 <= 0 Then
            Einheit.Leben = 1
        Else
            Einheit.Leben -= Schaden * 10
        End If
        neuesVerteidigerLeben = Einheit.Leben
        If VerteidigerFlug = True Then
            If Schaden > 0 Then
                If Einheit.Besetzen Then
                    If VerteidigerX <> EinheitenPosition.X Or VerteidigerY <> EinheitenPosition.Y Then
                        Einheit.Besetzen = False
                        Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Einheit.GetMap).Gebaeude.Besetzung = 20
                    End If
                End If
                Einheit.GetSpieler.RemoveEinheit(Einheit, ObjektSpieler.ExternGezogeneEinheit.Befehle.Heilen)
            End If
            VerteidigerX = EinheitenPosition.X
            VerteidigerY = EinheitenPosition.Y
            Einheit.X = VerteidigerX
            Einheit.Y = VerteidigerY
        Else
            If Schaden > 0 Then
                If Einheit.Besetzen Then
                    If AngreiferX <> EinheitenPosition.X Or AngreiferY <> EinheitenPosition.Y Then
                        Einheit.Besetzen = False
                        Objektverwalter.Spielfeld.Landschaften(AngreiferX, AngreiferY, Einheit.GetMap).Gebaeude.Besetzung = 20
                    End If
                End If
                Einheit.GetSpieler.RemoveEinheit(Einheit, ObjektSpieler.ExternGezogeneEinheit.Befehle.Heilen)
            End If
            AngreiferX = EinheitenPosition.X
            AngreiferY = EinheitenPosition.Y
            Einheit.X = AngreiferX
            Einheit.Y = AngreiferY
            Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(AngreiferX, AngreiferY)
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Objektverwalter.Spielfeld.Laufen.Position = New Point(AngreiferX, AngreiferY)
            End If
        End If

    End Sub
    ''' <summary>
    ''' Wir haben eine Einheit zerstoert Aufzeichnen!
    ''' </summary>
    ''' <param name="LooserPlayer"></param>
    ''' <param name="DestroyerPlayer"></param>
    ''' <remarks></remarks>
    Public Sub UnitDestroyed(ByVal LooserPlayer As Integer, ByVal DestroyerPlayer As Integer)
        Objektverwalter.Spielfeld.Aufzeichnung.DestroyedUnits(DestroyerPlayer - 1) += 1
        KI_Sprache.KISprechen(KI_Sprache.KILaunen.Freude, Objektverwalter.Spielfeld.Spieler(DestroyerPlayer))
        Objektverwalter.Spielfeld.Aufzeichnung.LostUnits(LooserPlayer - 1) += 1
        KI_Sprache.KISprechen(KI_Sprache.KILaunen.Trauer, Objektverwalter.Spielfeld.Spieler(LooserPlayer))
    End Sub
End Class
''' <summary>
''' Stellt die Kampfgrafiken zur Verfuegung
''' </summary>
''' <remarks></remarks>
Public Class KampfGrafiken
    Const MaxStyles As Integer = 0
    Private Shared ScreenFlash(0) As Texture
    Private Shared Gestartet As Boolean = False
    Private Shared Luft(MaxStyles, 1) As Texture
    Private Shared Wald(MaxStyles, 1) As Texture
    Private Shared Ebene(MaxStyles, 2) As Texture
    Private Shared Strasse(MaxStyles) As Texture
    Private Shared Berg(MaxStyles) As Texture
    Private Shared Gebaeude(MaxStyles, 4) As Texture
    Private Shared Bruecke(MaxStyles) As Texture
    Private Shared See(MaxStyles) As Texture
    Private Shared Strand(MaxStyles) As Texture
    Private Shared Fluss(MaxStyles) As Texture
    Private Shared Pipeline(MaxStyles) As Texture
    ''Transparency over efficieny. Alas
    Private Shared BackWald(MaxStyles, 1) As Texture
    Private Shared BackEbene(MaxStyles) As Texture
    Private Shared BackStrasse(MaxStyles) As Texture
    Private Shared BackBerg(MaxStyles, 1) As Texture
    Private Shared BackGebaeude(MaxStyles, 4) As Texture
    Private Shared BackBruecke(MaxStyles) As Texture
    Private Shared BackSee(MaxStyles) As Texture
    Private Shared BackStrand(MaxStyles) As Texture
    Private Shared BackFluss(MaxStyles) As Texture

    Private Shared HQ(MaxStyles, 11) As Texture
    Private Shared BackHQ(MaxStyles, 11) As Texture

    Private Shared SonstigeTexturen(3) As Texture

    Enum Kampfanimation
        Rakete
        RaketenRauch
        Bomben
        Bazooka
    End Enum
    ''' <summary>
    ''' Texturen von Waffen die gemalt werden koennen.
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared WaffenTexturen(3) As Texture
    Public Sub New()
        If DataSettings.CommanderWarsGameModus <> CommanderWarsGameModi.FireEmblem Then
            If Gestartet = False Then
                LoadTextures()
                LoadWaffenAnimationen()
            End If
            Gestartet = True
        End If
    End Sub
    Private Shared Sub LoadTextures()
        ScreenFlash(0) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\ScreenFlah.bmp")
        SonstigeTexturen(0) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\KampfanimationHinten.png")
        SonstigeTexturen(1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\KampfanimationVorne.png")
        SonstigeTexturen(2) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\ButtonRund.png")
        SonstigeTexturen(3) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\ButtonRundVorne.png")
        For I = 0 To MaxStyles
            Luft(I, 0) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\Luft+" + I.ToString + ".png")
            Luft(I, 1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Battle\Wald+" + I.ToString + ".png")
            'untere Teile
            'Wald
            Dim B As Bitmap = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Wald+" + I.ToString + "+A.png")
            Wald(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Wald+" + I.ToString + "+B.png")
            Wald(I, 1) = Grafikengine.LoadTexture(B)
            'Ebene
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Ebene+" + I.ToString + "+A.png")
            Ebene(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Ebene+" + I.ToString + "+B.png")
            Ebene(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Ebene+" + I.ToString + "+C.png")
            Ebene(I, 2) = Grafikengine.LoadTexture(B)
            'Strasse
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Strasse+" + I.ToString + ".png")
            Strasse(I) = Grafikengine.LoadTexture(B)
            'Gebaeude
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\STADT+" + I.ToString + "+A.png")
            Gebaeude(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\STADT+" + I.ToString + "+B.png")
            Gebaeude(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Basis+" + I.ToString + ".png")
            Gebaeude(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Flughafen+" + I.ToString + ".png")
            Gebaeude(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Werft+" + I.ToString + ".png")
            Gebaeude(I, 4) = Grafikengine.LoadTexture(B)
            'Berg
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Berg+" + I.ToString + ".png")
            Berg(I) = Grafikengine.LoadTexture(B)
            'Bruecke
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Bruecke+" + I.ToString + ".png")
            Bruecke(I) = Grafikengine.LoadTexture(B)
            'See
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\See+" + I.ToString + ".png")
            See(I) = Grafikengine.LoadTexture(B)
            'Fluss
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Fluss+" + I.ToString + ".png")
            Fluss(I) = Grafikengine.LoadTexture(B)
            'Strand
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Strand+" + I.ToString + ".png")
            Strand(I) = Grafikengine.LoadTexture(B)

            'Pipeline
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\Pipeline+" + I.ToString + ".png")
            Pipeline(I) = Grafikengine.LoadTexture(B)
            'Oberere Teile
            'Wald
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Wald+" + I.ToString + "+A.png")
            BackWald(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Wald+" + I.ToString + "+B.png")
            BackWald(I, 1) = Grafikengine.LoadTexture(B)
            'Ebene
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\EBENE+" + I.ToString + ".png")
            BackEbene(I) = Grafikengine.LoadTexture(B)
            'Strasse
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Strasse+" + I.ToString + ".png")
            BackStrasse(I) = Grafikengine.LoadTexture(B)
            'Gebaeude
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\STADT+" + I.ToString + "+A.png")
            BackGebaeude(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\STADT+" + I.ToString + "+B.png")
            BackGebaeude(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Basis+" + I.ToString + ".png")
            BackGebaeude(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Flughafen+" + I.ToString + ".png")
            BackGebaeude(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Werft+" + I.ToString + ".png")
            BackGebaeude(I, 4) = Grafikengine.LoadTexture(B)
            'Berg
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Berg+" + I.ToString + "+A.png")
            BackBerg(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Berg+" + I.ToString + "+B.png")
            BackBerg(I, 1) = Grafikengine.LoadTexture(B)
            'Bruecke
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Bruecke+" + I.ToString + ".png")
            BackBruecke(I) = Grafikengine.LoadTexture(B)
            'See
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\See+" + I.ToString + ".png")
            BackSee(I) = Grafikengine.LoadTexture(B)
            'Strand
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Strand+" + I.ToString + ".png")
            BackStrand(I) = Grafikengine.LoadTexture(B)
            'Fluss
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\Fluss+" + I.ToString + ".png")
            BackFluss(I) = Grafikengine.LoadTexture(B)

            'HQ's
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+BM+" + I.ToString + ".png")
            HQ(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+GE+" + I.ToString + ".png")
            HQ(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+YC+" + I.ToString + ".png")
            HQ(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+BH+" + I.ToString + ".png")
            HQ(I, 4) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 5) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 6) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 7) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 8) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 9) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 10) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Foreground\HQ+OS+" + I.ToString + ".png")
            HQ(I, 11) = Grafikengine.LoadTexture(B)

            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+BM+" + I.ToString + ".png")
            BackHQ(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+GE+" + I.ToString + ".png")
            BackHQ(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+YC+" + I.ToString + ".png")
            BackHQ(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+BH+" + I.ToString + ".png")
            BackHQ(I, 4) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 5) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 6) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 7) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 8) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 9) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 10) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Background\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 11) = Grafikengine.LoadTexture(B)

        Next


    End Sub
    Private Shared Sub LoadWaffenAnimationen()
        Dim B As Bitmap = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Weapon Animations\Rakete.png")
        WaffenTexturen(0) = Grafikengine.LoadTexture(B)
        B = Image.FromFile(DataSettings.Resourcenpfad + "Battle\Weapon Animations\RaketenstartRauch.png")
        WaffenTexturen(1) = Grafikengine.LoadTexture(B)
        WaffenTexturen(2) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Battle\Weapon Animations\Bomben.png"))
        WaffenTexturen(3) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Battle\Weapon Animations\Bazooka.png"))

    End Sub
    Public Shared Function getSky(ByVal Style As Integer, ByVal Landschaft As ObjektLandschaft) As Texture
        If Landschaft.getID = "WALD" Or Landschaft.getID = "KAKTEEN" Or Landschaft.getID = "KIEFERN" Then
            Return Luft(Style, 1)
        Else
            Return Luft(Style, 0)
        End If
    End Function
    Public Shared Function GetAirSky(ByVal Style As Integer)
        Return Luft(Style, 0)
    End Function
    Public Shared Function getPlainBack(ByVal attacker As ObjektEinheit, ByVal defender As ObjektEinheit, ByVal style As Integer) As Texture
        Dim atkTerrain As ObjektLandschaft = attacker.GetTerrain
        Dim defTerrain As ObjektLandschaft = defender.GetTerrain
        Dim orientation As Integer = orient(attacker.GetLocation, defender.GetLocation)
        Select Case orientation
            Case 0 'north
                If Objektverwalter.Spielfeld.OnMap(attacker.X, attacker.Y + 1) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X, attacker.Y + 1, attacker.GetMap), 0)
                End If
            Case 1 'west
                If Objektverwalter.Spielfeld.OnMap(attacker.X + 1, attacker.Y) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X + 1, attacker.Y, attacker.GetMap), 0)
                End If
            Case 2 'south
                If Objektverwalter.Spielfeld.OnMap(attacker.X, attacker.Y - 1) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X, attacker.Y - 1, attacker.GetMap), 0)
                End If
            Case 3 ' east
                If Objektverwalter.Spielfeld.OnMap(attacker.X - 1, attacker.Y) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X - 1, attacker.Y, attacker.GetMap), 0)
                End If
            Case Else
                Return BackWald(style, 0) ' // if the angle isn't orthogonal, use wood.'
        End Select
        Return BackWald(style, 0)
    End Function
    ''' <summary>
    ''' 0=Nord
    ''' 1=West
    ''' 2=Sued
    ''' 3=Ost
    ''' </summary>
    ''' <param name="P1"></param>
    ''' <param name="P2"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function orient(ByVal P1 As Point, ByVal P2 As Point) As Integer

        '//Expect this to be upgraded later
        Dim dir As Integer = 0
        '//same location? -1!
        If P1.X = P2.X And P1.Y = P2.Y Then Return -1

        If P1.X = P2.X Then
            If P1.Y > P2.Y Then '//If this is below, otherwise, above
                Return 1
            Else
                Return 3
            End If
        ElseIf P1.Y = P2.Y Then

            If P1.X > P2.X Then ' //If this is below, otherwise, above
                Return 0
            Else
                Return 2
            End If
        Else
            Return -1
        End If
    End Function
    ''' <summary>
    ''' Gibt den Hintergrund einer Landschaft weiter hinten zurueck.
    ''' </summary>
    ''' <param name="t"></param>
    ''' <param name="Style"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getBackDrop(ByVal t As ObjektLandschaft, ByVal Style As Integer) As Texture
        If t.isGebaeude Then
            Return BackGebaeude(Style, 0)
        Else
            Select Case t.getID
                Case "EBENE"
                    Return BackEbene(Style)
                Case "EBENE+SCHROTT"
                    Return BackEbene(Style)
                Case "WALD"
                    Return BackWald(Style, 0)
                Case "BERG"
                    Return BackBerg(Style, 0)
                Case "STRASSE"
                    Return BackStrasse(Style)
                Case Else
                    Return BackEbene(Style)
            End Select
        End If
    End Function
    ''' <summary>
    ''' Gibt den Hintergrund normal zurueck
    ''' </summary>
    ''' <param name="style"></param>
    ''' <param name="t"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getAltBack(ByVal style As Integer, ByVal t As ObjektLandschaft) As Texture

        Select Case t.getID
            'Hier haben wir die Gebaeude
            Case "STADT"
                Return BackGebaeude(style, 1)
            Case "BASIS"
                Return BackGebaeude(style, 2)
            Case "FLUGHAFEN"
                Return BackGebaeude(style, 3)
            Case "WERFT"
                Return BackGebaeude(style, 4)
            Case "HQ"
                Dim AMN As Integer = t.Gebaeude.GetSpieler.GetArmyNumber
                If AMN >= BackHQ.Length Then
                    Return BackHQ(style, 0)
                Else
                    Return BackHQ(style, AMN)
                End If
                'Hier die Landschaften
            Case "EBENE"
                Return BackEbene(style)
            Case "EBENE+SCHROTT"
                Return BackEbene(style)
            Case "WALD"
                Return BackWald(style, 1)
            Case "BERG"
                Return BackBerg(MaxStyles, 1)
            Case "STRASSE"
                Return BackStrasse(MaxStyles)
            Case "BRUECKE"
                Return BackBruecke(MaxStyles)
            Case "FLUSS"
                Return BackFluss(MaxStyles)
            Case "SEE"
                Return BackSee(MaxStyles)
            Case "RIFF"
                Return BackSee(MaxStyles)
            Case "STRAND"
                Return BackStrand(MaxStyles)
            Case "PFAD"
                Return BackStrasse(MaxStyles)
            Case "WUESTE"
                Return BackEbene(style)
            Case "WUESTE+SCHROTT"
                Return BackEbene(style)
            Case "AUSGETROCKNETESFLUSSBETT"
                Return BackFluss(MaxStyles)
            Case "FELSEN"
                Return BackBerg(MaxStyles, 1)
            Case "KAKTEEN"
                Return BackWald(style, 1)
            Case "PIPELINE"
                Return BackEbene(style)
            Case "PIPE"
                Return BackEbene(style)
            Case "PIPESCHWEISS"
                Return BackEbene(style)
            Case "SCHWEISSNAHT"
                Return BackEbene(style)
            Case "KAPUTTESCHWEISSNAHT"
                Return BackEbene(style)
            Case "ZUGBRUECKE"
                Return BackBruecke(MaxStyles)
            Case "MAUER"
                Return BackEbene(style)
            Case "KAPUTTEPIPESCHWEISS"
                Return BackEbene(style)
            Case "PLINE"
                Return BackEbene(style)
            Case "PLINESCHWEISS"
                Return BackEbene(style)
            Case "PLINEKAPUTT"
                Return BackEbene(style)
            Case "GIPFEL"
                Return BackBerg(MaxStyles, 1)
            Case "KIEFERN"
                Return BackWald(style, 1)
            Case "SCHNEE"
                Return BackEbene(style)
            Case "STRASSENFROST"
                Return BackStrasse(style)
            Case "SCHNEE+SCHROTT"
                Return BackEbene(style)
            Case "SUMPF"
                Return BackEbene(style)
            Case Else
                If t.isGebaeude Then
                    Return BackGebaeude(style, 1)
                Else
                    Return BackWald(style, 0)
                End If
        End Select
    End Function
    ''' <summary>
    ''' Gibt den Vordergrund zurueck.
    ''' </summary>
    ''' <param name="style"></param>
    ''' <param name="t"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getFore(ByVal style As Integer, ByVal t As ObjektLandschaft, Optional ByVal NoRandom As Boolean = False)
        If t.isGebaeude Then
            Select Case t.getID
                Case "STADT"
                    Return Gebaeude(style, 0)
                Case "BASIS"
                    Return Gebaeude(style, 2)
                Case "FLUGHAFEN"
                    Return Gebaeude(style, 3)
                Case "WERFT"
                    Return Gebaeude(style, 4)
                Case "HQ"
                    Dim AMN As Integer = t.Gebaeude.GetSpieler.GetArmyNumber
                    If AMN >= HQ.Length Then
                        Return HQ(style, 0)
                    Else
                        Return HQ(style, AMN)
                    End If
                Case Else
                    Return Gebaeude(style, 0)
            End Select
        Else
            Select Case t.getID
                Case "EBENE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If

                Case "EBENE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "WALD"
                    Return Wald(style, 1)
                Case "BERG"
                    Return Berg(MaxStyles)
                Case "STRASSE"
                    Return Strasse(MaxStyles)
                Case "BRUECKE"
                    Return Bruecke(MaxStyles)
                Case "FLUSS"
                    Return Fluss(MaxStyles)
                Case "SEE"
                    Return See(MaxStyles)
                Case "RIFF"
                    Return See(MaxStyles)
                Case "STRAND"
                    Return Strand(MaxStyles)
                Case "PFAD"
                    Return Strasse(MaxStyles)
                Case "WUESTE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "WUESTE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "AUSGETROCKNETESFLUSSBETT"
                    Return Fluss(MaxStyles)
                Case "FELSEN"
                    Return Berg(MaxStyles)
                Case "KAKTEEN"
                    Return Wald(style, 1)
                Case "PIPELINE"
                    Return Pipeline(style)
                Case "PIPE"
                    Return Pipeline(style)
                Case "PIPESCHWEISS"
                    Return Pipeline(style)
                Case "SCHWEISSNAHT"
                    Return Pipeline(style)
                Case "KAPUTTESCHWEISSNAHT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "ZUGBRUECKE"
                    Return Bruecke(MaxStyles)
                Case "MAUER"
                    Return Pipeline(style)
                Case "KAPUTTEPIPESCHWEISS"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "PLINE"
                    Return Pipeline(style)
                Case "PLINESCHWEISS"
                    Return Pipeline(style)
                Case "PLINEKAPUTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "GIPFEL"
                    Return Berg(MaxStyles)
                Case "KIEFERN"
                    Return Wald(style, 1)
                Case "SCHNEE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "STRASSENFROST"
                    Return Strasse(style)
                Case "SCHNEE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "SUMPF"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case Else
                    Return Ebene(style, 0)
            End Select
        End If
    End Function
    Public Shared Function GetForeSee(ByVal Style As Integer) As Texture
        Return See(Style)
    End Function
    Public Shared Function GetAltBackSee(ByVal Style As Integer) As Texture
        Return BackSee(Style)
    End Function
    Public Shared Function GetScreenFlash(ByVal Screen As Integer) As Texture
        Return ScreenFlash(Screen)
    End Function
    Public Shared Function GetSonstigeTexturen(ByVal I As Integer) As Texture
        Return SonstigeTexturen(I)
    End Function
    Public Shared Function GetWaffenAnimation(ByVal Animation As Kampfanimation, ByVal Flip As Boolean)
        Return WaffenTexturen(Animation)
    End Function
End Class
Public Class KampfAnimation
    Public Const KampfStart As Integer = 15
    Public Const Bildbreite As Integer = 127
    Public Const BildHoehe As Integer = 192
    Public Shared SchadensFrameVerteidiger As Integer = 145
    Public Shared SchadensFrameAngreifer As Integer = 180
    Public Const Schadensdauer As Integer = 20
    Public Shared intColor As Color = Color.FromArgb(255, 255, 255, 255)
    Dim attacker As ObjektEinheit
    Dim defender As ObjektEinheit
    Dim backa, backb As Texture
    Dim forea, foreb As Texture
    Dim Flashscreen As Integer = 0
    Dim atkTerrain, defTerrain As ObjektLandschaft
    Dim atkDmg, countDmg As Integer
    Dim Dauer As Integer = 220
    Dim AttackerAnimation As EinheitenAnimation
    Dim DeffenderAnimation As EinheitenAnimation
    Private Frames As Integer
    Public Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
        End Set
    End Property
    Dim MalX As Integer = 0
    Dim MalY As Integer = 0
    Dim Fernkampf As Boolean = False

    ''' <summary>
    ''' Shares Animated Backgroundsize
    ''' </summary>
    ''' <remarks></remarks>
    Public AnimatedBackgroundSizeAttacker As Integer = Bildbreite
    ''' <summary>
    ''' Used for Animated Backgroudns
    ''' </summary>
    ''' <remarks></remarks>
    Dim BewegungsXAttacker As Integer = 0
    ''' <summary>
    ''' Shares Animated Backgroundsize
    ''' </summary>
    ''' <remarks></remarks>
    Public AnimatedBackgroundSizeDeffender As Integer = Bildbreite
    ''' <summary>
    ''' Used for Animated Backgroudns
    ''' </summary>
    ''' <remarks></remarks>
    Dim BewegungsXDeffender As Integer = 0

    ''' <summary>
    ''' Das X zum Malen der bewegten Luft bzw. See.
    ''' </summary>
    ''' <remarks></remarks>
    Dim BewegungsX As Integer

    Public Sub New(ByVal ATK As ObjektEinheit, ByVal Def As ObjektEinheit, ByVal counterDamage As Integer, ByVal damage As Integer, ByVal Fernkampf As Boolean)
        ObjektMaus.Visible = False
        atkDmg = damage
        If atkDmg > Def.Leben Then atkDmg = Def.Leben
        countDmg = counterDamage
        If countDmg > ATK.Leben Then countDmg = ATK.Leben
        Me.Fernkampf = Fernkampf
        attacker = ATK
        defender = Def
        Dim OpferPosition As EinheitenAnimation.OpferPositionen = EinheitenAnimation.OpferPositionen.GleicheHoehe
        Dim AngreiferPosition As EinheitenAnimation.OpferPositionen = EinheitenAnimation.OpferPositionen.GleicheHoehe
        Dim ATKFliegt As Boolean = ATK.IsFlyingUnit
        Dim DEFFliegt As Boolean = Def.IsFlyingUnit
        If ATKFliegt = DEFFliegt Then
            If ATKFliegt = False Then
                'Jetzt muessten wir schauen ob eine Einheit auf einem Berg steht und das waere es. 
                'Verschoben
            Else
                OpferPosition = EinheitenAnimation.OpferPositionen.GleicheHoehe
                AngreiferPosition = EinheitenAnimation.OpferPositionen.GleicheHoehe
            End If
        ElseIf ATKFliegt = True And DEFFliegt = False Then
            OpferPosition = EinheitenAnimation.OpferPositionen.Unten
            AngreiferPosition = EinheitenAnimation.OpferPositionen.Oben
        ElseIf ATKFliegt = False And DEFFliegt = True Then
            OpferPosition = EinheitenAnimation.OpferPositionen.Oben
            AngreiferPosition = EinheitenAnimation.OpferPositionen.Unten
        End If

        AttackerAnimation = EinheitenAnimation.CreateUnitAnimation(ATK, counterDamage, False, ATK.GetUsingWeapon(defender, Fernkampf), Fernkampf, OpferPosition)

        If Fernkampf Or counterDamage <= 0 Then
            DeffenderAnimation = EinheitenAnimation.CreateUnitAnimation(Def, atkDmg, True, Def.GetUsingWeapon(ATK, Fernkampf), True, AngreiferPosition)
        Else
            DeffenderAnimation = EinheitenAnimation.CreateUnitAnimation(Def, atkDmg, True, Def.GetUsingWeapon(ATK, Fernkampf), Fernkampf, AngreiferPosition)
        End If


        'Nach dem Schaden warten wir noch kurz
        Dauer = SchadensFrameAngreifer + 20

        If Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            forea = KampfGrafiken.getFore(0, attacker.GetTerrain)
        Else
            forea = KampfGrafiken.GetForeSee(0)
        End If
        If Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            foreb = KampfGrafiken.getFore(0, defender.GetTerrain)
        Else
            foreb = KampfGrafiken.GetForeSee(0)
        End If
        atkTerrain = attacker.GetTerrain
        defTerrain = defender.GetTerrain

        'Damit die Animation in der Bildschirme Mitte gezeigt wird.
        MalX = DataSettings.BildschirmBreite / 2 - Bildbreite - 2
        MalY = DataSettings.BildschirmHoehe / 2 - BildHoehe / 2
        'eventuell spaeter um links rechts von Angreifer Verteidiger zu setzen
        Dim orientation As Integer = KampfGrafiken.orient(attacker.GetLocation(), defender.GetLocation())

        If Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            Select Case atkTerrain.getID
                Case "EBENE"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case "STRASSE"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case "EBENE+SCHROTT"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case Else
                    backa = KampfGrafiken.getAltBack(0, atkTerrain)
            End Select
        Else
            backa = KampfGrafiken.GetAltBackSee(0)
        End If
        If Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            Select Case defTerrain.getID
                Case "EBENE"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case "STRASSE"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case "EBENE+SCHROTT"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case Else
                    backb = KampfGrafiken.getAltBack(0, defTerrain)
            End Select
        Else
            backb = KampfGrafiken.GetAltBackSee(0)
        End If

        'Event Handling hinzufuegen
    End Sub
    Public Function Malen() As Boolean
        Dim sngRotation As Single = 0
        Grafikengine.ptfRotCenter = New Point(0, 0)
        If Frame < KampfStart Then
            intColor = Color.FromArgb(Frames * 5, 255, 255, 255)
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(0, 0)
            With Grafikengine.szfScale
                .Height = DataSettings.BildschirmHoehe
                .Width = DataSettings.BildschirmBreite
            End With
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetScreenFlash(Flashscreen), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

        Else
            intColor = Color.FromArgb(102, 255, 255, 255)
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(0, 0)
            With Grafikengine.szfScale
                .Height = DataSettings.BildschirmHoehe
                .Width = DataSettings.BildschirmBreite
            End With
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetScreenFlash(Flashscreen), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If


        intColor = Color.FromArgb(255, 255, 255, 255)


        If Frame < Dauer And Frame > KampfStart Then


            With Grafikengine.szfScale
                .Width = 320
                .Height = 250
            End With
            Grafikengine.ptfPosition = New Drawing.Point(MalX - 31, MalY - 34)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX, MalY)
            Grafikengine.szfScale = Nothing
            'BewegungsX Update
            'BewegungsX Update
            BewegungsXAttacker += 3
            If BewegungsXAttacker > AnimatedBackgroundSizeAttacker Then BewegungsXAttacker -= AnimatedBackgroundSizeAttacker
            'Zuerst Malen wir die Angreifer Seite
            If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper Then
                Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                'Jetzt malen wir die Sache bewegt.
                With Grafikengine.recBild
                    .X = BewegungsXAttacker : .Width = AnimatedBackgroundSizeAttacker - BewegungsXAttacker
                    .Y = 0 : .Height = BildHoehe
                    If .Width > Bildbreite - BewegungsXAttacker Then .Width = Bildbreite - BewegungsXAttacker
                End With

                If attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If

                Grafikengine.ptfPosition.X += Grafikengine.recBild.Width
                With Grafikengine.recBild
                    .X = 0 : .Width = BewegungsXAttacker
                    .Y = 0 : .Height = BildHoehe
                End With
                If attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                'Zuruecksetzen fuers weitere malen.
                Grafikengine.recBild = Nothing
                Grafikengine.ptfRotCenter = New Point()
            End If
            Grafikengine.ptfPosition = New Drawing.Point(MalX + Bildbreite * 2 + 4, MalY)
            'Jetzt die Verteidiger Seite
            With Grafikengine.szfScale
                .Height = BildHoehe
                .Width = -Bildbreite
            End With

            BewegungsXDeffender += 3
            If BewegungsXDeffender > AnimatedBackgroundSizeDeffender Then BewegungsXDeffender -= AnimatedBackgroundSizeDeffender
            If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper Then
                Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                'Jetzt malen wir die Sache bewegt.
                With Grafikengine.recBild
                    .X = BewegungsXDeffender : .Width = (AnimatedBackgroundSizeDeffender - BewegungsXDeffender)
                    .Y = 0 : .Height = BildHoehe
                    If .Width > Bildbreite - BewegungsXDeffender Then .Width = -(Bildbreite - BewegungsXDeffender)
                End With
                Grafikengine.szfScale.Width = -Grafikengine.recBild.Width
                If defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If

                Grafikengine.ptfPosition.X -= Grafikengine.recBild.Width
                With Grafikengine.recBild
                    .X = 0 : .Width = BewegungsXDeffender
                    .Y = 0 : .Height = BildHoehe
                End With
                Grafikengine.szfScale.Width = -Grafikengine.recBild.Width
                If defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                'Zuruecksetzen fuers weitere malen.
                Grafikengine.recBild = Nothing
                Grafikengine.ptfRotCenter = New Point()
            End If


            Grafikengine.szfScale = Nothing
            Dim ATKLeben As Single = attacker.Leben
            Dim DEFLeben As Single = defender.Leben
            If Frame > SchadensFrameAngreifer Then
                If Frame <= SchadensFrameAngreifer + Schadensdauer Then
                    Dim ProzLeben As Single = (((attacker.Leben) * (20 - (Frame - SchadensFrameAngreifer)) + (attacker.Leben - countDmg) * (Frame - SchadensFrameAngreifer)) / 20) / (100)
                    ATKLeben *= ProzLeben
                    Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben)) 'draws the appropriate percent of the life bar
                    'Jetzt malen wir noch die Lebenszahl

                Else
                    Dim ProzLeben As Single = (attacker.Leben - countDmg) / (100)
                    ATKLeben *= ProzLeben
                    Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben))
                End If
            Else
                Dim ProzLeben As Single = (attacker.Leben) / (100)
                ATKLeben *= ProzLeben
                Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben)) 'draws the appropriate percent of the life bar
            End If

            If Frame > SchadensFrameVerteidiger Then
                If Frame <= SchadensFrameVerteidiger + Schadensdauer Then
                    Dim ProzLeben As Single = (((defender.Leben) * (20 - (Frame - SchadensFrameVerteidiger)) + (defender.Leben - atkDmg) * (Frame - SchadensFrameVerteidiger)) / 20) / (100)
                    DEFLeben *= ProzLeben
                    Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
                Else
                    Dim ProzLeben As Single = (defender.Leben - atkDmg) / (100)
                    DEFLeben *= ProzLeben
                    Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
                End If
            Else
                Dim ProzLeben As Single = (defender.Leben) / (100)
                DEFLeben *= ProzLeben
                Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
            End If
            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            If Not attacker.IsFlyingUnit Then
                Dim Max As Integer = attacker.GetSpieler.GetDeffensivSterne(defender, atkTerrain)
                Dim StartX As Integer = 127 - Max * 8 - 5
                Grafikengine.ptfPosition = New Drawing.Point(MalX + StartX, MalY + 12)
                For I = 0 To Max - 1
                    Grafikengine.Sprite.Draw2D(ObjektKOInformation.BildTexturen(5), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 8
                    If I = 4 Then
                        Grafikengine.ptfPosition = New Drawing.Point(MalX + StartX + 1 + Bildbreite, MalY + 12 + 10)
                    End If
                Next
            End If
            If Not defender.IsFlyingUnit Then
                Grafikengine.ptfPosition = New Drawing.Point(MalX + 5 + Bildbreite, MalY + 12)
                For I = 0 To defender.GetSpieler.GetDeffensivSterne(attacker, defTerrain) - 1
                    Grafikengine.Sprite.Draw2D(ObjektKOInformation.BildTexturen(5), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 8
                    If I = 4 Then
                        Grafikengine.ptfPosition = New Drawing.Point(MalX + 4 + Bildbreite, MalY + 12 + 10)
                    End If
                Next
            End If
            Grafikengine.szfScale = Nothing
            AttackerAnimation.Malen(Frame, New Point(MalX, MalY))
            DeffenderAnimation.Malen(Frame, New Point(MalX, MalY))
            AttackerAnimation.MalenWaffenSysteme(Frame, New Point(MalX, MalY))
            DeffenderAnimation.MalenWaffenSysteme(Frame, New Point(MalX, MalY))
            'Zuletzt malen wir diesen Vordergrundteil
            With Grafikengine.szfScale
                .Width = 320
                .Height = 250
            End With
            'Wir malen den Button auf den das KO Bild kommt
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX - 31, MalY - 34)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX, MalY)

            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40 + 127 * 2 + 4 - 48, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

            Dim emotiona As Integer = CalculateEmotion(ATKLeben, DEFLeben, True)
            Dim emotionb As Integer = CalculateEmotion(DEFLeben, ATKLeben, False)


            'Angreifer KO Malen
            Objektverwalter.GetKO(Objektverwalter.Spielfeld.Spieler(attacker.Spieler).KOS(0).Bild).KOGesichtsausdruckMalen _
            (emotiona, MalX, MalY + 5)
            'Verteidiger KO Malne
            Objektverwalter.GetKO(Objektverwalter.Spielfeld.Spieler(defender.Spieler).KOS(0).Bild).KOGesichtsausdruckMalen _
            (emotionb, MalX + 127 * 2 + 4 - 48, MalY + 5)

            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40 + 127 * 2 + 4 - 48, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)


        End If
        If Frame > Dauer Then
            RemoveHandles()
            Return True
        End If
        Frame = 1
        Return False
    End Function
    Public Shared Function CalculateLiveBarColor(ByVal Leben As Single) As Color
        Select Case Leben
            Case Is > 80
                Return Color.Green
            Case Is > 60
                Return Color.FromArgb(255, 0, 192, 0)
            Case Is > 40
                Return Color.Yellow
            Case Is > 20
                Return Color.Orange
            Case Else
                Return Color.Red
        End Select
    End Function
    ''' <summary>
    ''' 0=Keine
    ''' 1=Lachend
    ''' 2=Traurig
    ''' </summary>
    ''' <param name="EigenLeben"></param>
    ''' <param name="GegnerLeben"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CalculateEmotion(ByVal EigenLeben As Single, ByVal GegnerLeben As Single, ByVal Angreifer As Boolean) As Integer
        Dim Emotion As Integer = 0

        If Fernkampf = True Then
            If Angreifer Then
                Emotion = 1
            Else
                Emotion = 2
            End If
            Return Emotion
        Else
            If EigenLeben = 0 Then
                Emotion = 2
            ElseIf EigenLeben - GegnerLeben > 30 Then
                Emotion = 1
            ElseIf EigenLeben - GegnerLeben < -30 Then
                Emotion = 2
            Else
                If Angreifer Then
                    If attacker.Leben - countDmg <= 0 And EigenLeben < 30 Then
                        Emotion = 2
                    ElseIf defender.Leben - atkDmg <= 0 And GegnerLeben < 30 Then
                        Emotion = 1
                    End If
                Else
                    If defender.Leben - atkDmg <= 0 And EigenLeben < 30 Then
                        Emotion = 2
                    ElseIf attacker.Leben - countDmg <= 0 And EigenLeben < 30 Then
                        Emotion = 1
                    End If
                End If
            End If
        End If
        Return Emotion
    End Function

    Public Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case MouseButtons.Right
                Frames = Dauer + 1
        End Select
    End Sub
    Public Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case DataSettings.Abrechen
                Frames = Dauer + 1
        End Select
    End Sub
    Public Sub RemoveHandles()
    End Sub
End Class
Public MustInherit Class EinheitenAnimation
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <param name="Flip"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Unit As ObjektEinheit, ByVal Flip As Boolean, ByVal Damage As Single, ByVal Waffe As Integer, ByVal YStart As Integer, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
        Dim Animation As Objektverwalter.Kampfanimation = Objektverwalter.AlleEinheiten(Unit.BildID).GetKampfAnimation(Unit.GetSpieler.Armee)
        'For I = 0 To Unit.GetSpieler.Kampfanimationen.Length - 1
        '    If Unit.EinheitenID = Unit.GetSpieler.Kampfanimationen(I).EinheitenID Then
        '        Animation = Unit.GetSpieler.Kampfanimationen(I)
        '        Exit For
        '    End If
        'Next

        NumberOfUnits = Animation.Truppenzahl
        Einheit = Unit
        Me.Spielerfarbe = Unit.GetSpieler.Farbe
        If Einheit.Bewegungsart = MovementSorts.Flugzeug.ToString Or Einheit.Bewegungsart = MovementSorts.Helikopter.ToString Then
            'Die Einheit fliegt
            FlyingUnit = True
        Else
            FlyingUnit = False
        End If
        Me.Flip = Flip
        Schaden = Damage
        Me.MoveAnimationFrames = Animation.MovementFrames
        Me.StoppingFrames = Animation.Stoppingframes
        MoveAnimation = Animation.GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Walk)
        MoveAnimationMaske = Animation.GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Walk)
        If Waffe = 1 Then
            Me.FireAnimationFrames = Animation.GetFrames(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
            FireAnimation = Animation.GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
            FireAnimationMaske = Animation.GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
        ElseIf Waffe = 2 Then
            Me.FireAnimationFrames = Animation.GetFrames(Objektverwalter.Kampfanimation.Textur.Animations.Weapon2_Normal)
            FireAnimation = Animation.GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Weapon2_Normal)
            FireAnimationMaske = Animation.GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Weapon2_Normal)
        Else
            Me.FireAnimationFrames = Animation.GetFrames(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
            FireAnimation = Animation.GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
            FireAnimationMaske = Animation.GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
        End If
        Me.EinzelUnitPosition = Animation.EinzelUnitPosition
        Me.YStart = YStart
        Me.UsingWeapon = Waffe
        Me.OpferPosition = OpferPosition
        Me.Fernkampf = Fernkampf
        'wir berechnen den Framestart
        If Flip = False Then
            '40 weil 20 ist Schatten erstellen und wir warten noch mal 20 Frames
            If Fernkampf = True Or MoveAnimationFrames <= 0 Then
                'Wir warten etwas laenger
                FrameStart = 35
            Else
                FrameStart = 20
            End If
            KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter - 6
        Else
            If Fernkampf = True Or Waffe <= 0 Then
                KampfAnimation.SchadensFrameAngreifer = KampfAnimation.SchadensFrameVerteidiger
            Else
                '40 Frames zeit verzoegerung zum Angreifer.
                KampfAnimation.SchadensFrameAngreifer = KampfAnimation.SchadensFrameVerteidiger + 40
                FrameStart = KampfAnimation.SchadensFrameAngreifer - FireAnimationFrames * FrameHalter - 6
            End If
        End If
        'wir laden die Bilder
        Me.EinheitenBreite = Animation.Bildgroesse.Width
        Me.EinheitenHoehe = Animation.Bildgroesse.Height
    End Sub
    Public Shared Function CreateUnitAnimation(ByVal Unit As ObjektEinheit, ByVal Schaden As Single, ByVal Flip As Boolean, ByVal Waffe As Integer, ByVal DoCounterAttack As Boolean, ByVal OpferPosition As OpferPositionen)
        Select Case Unit.EinheitenID
            Case "KPZ"
                Return New EinheitenAnimationKampfPanzer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "RKW"
                Return New EinheitenAnimationRaketenwerfer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "TTP"
                Return New EinheitenAnimationTTP(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "INF"
                Return New EinheitenAnimationInfanterie(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "MECH"
                Return New EinheitenAnimationMech(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "JGPZ"
                Return New EinheitenAnimationJagdpanzer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "SPAEHER"
                Return New EinheitenAnimationSpaeher(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "ART"
                Return New EinheitenAnimationArtillerie(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "FLAK"
                Return New EinheitenAnimationFlak(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "TITANPZ"
                Return New EinheitenAnimationTitanpanzer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "MISSILE"
                Return New EinheitenAnimationMissile(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "BOMBER"
                Return New EinheitenAnimationBomber(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "S-BOMBE"
                Return New EinheitenAnimationSBombe(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "ZEPPELIN"
                Return New EinheitenAnimationZeppelin(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "T-FLUGZEUG"
                Return New EinheitenAnimationTFlugzeug(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case Else
                Return New EinheitenAnimationDefault(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
        End Select
    End Function
    Public MustOverride Sub Malen(ByVal Frames As Integer, ByVal MalStart As Point)
    Public MustOverride Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As Point)
#Region "Variablen"
    Enum OpferPositionen
        Unten
        GleicheHoehe
        Oben
    End Enum
    Const Bildbreite As Integer = 127
    Const BildHoehe As Integer = 192
    Const FrameHalter As Integer = 3 'So wie schnell der Kampf abgespielt wird!
    Protected YStart As Integer = 130
    Const XStart As Integer = -44
    Dim MovingSteps As Integer = 7
    ''' <summary>
    ''' Die Zahl der maximalen Truppenstaerke.
    ''' </summary>
    ''' <remarks></remarks>
    Dim NumberOfUnits As Integer = 5
    Protected MoveAnimation As Texture
    Protected MoveAnimationMaske As Texture
    Protected MoveAnimationFrames As Integer = 0
    Protected StoppingFrames As Integer = 0
    Protected FireAnimation As Texture
    Protected FireAnimationMaske As Texture
    Protected FireAnimationFrames As Integer = 0
    Protected Flip As Boolean = False
    Protected Einheit As ObjektEinheit
    Protected Schaden As Single
    Protected FrameStart As Integer = 120
    Protected EinzelUnitPosition As Point
    Protected FlyingUnit As Boolean
    Protected Fernkampf As Boolean
    Protected UsingWeapon As Integer
    Protected OpferPosition As OpferPositionen
    Dim EinheitenBreite As Integer = 100
    Dim EinheitenHoehe As Integer = 70
    Dim Spielerfarbe As Color
#End Region
#Region "Malen"
#Region "Units"
    ''' <summary>
    ''' Malt die Einheit\en beim reinlaufen 
    ''' </summary>
    ''' <param name="Frames"></param>
    ''' <remarks></remarks>
    Public Sub DrawMovingAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            'UeberlebendeEinheiten ist die Zahld der gemalten Truppen.
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                Frames -= UeberlebendeEinheiten
                If Flip = False Then
                    If Fernkampf = False Then
                        If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart And Frames <= FrameStart + MoveAnimationFrames * FrameHalter Then  'move in
                            Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                            'Die Einheit laeuft rein.
                            Dim MalFrame As Integer = (MoveAnimationFrames * FrameHalter) - (Frames - FrameStart)
                            Dim Position As Point = New Point(XStart - MalFrame * MovingSteps + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart + MoveAnimationFrames * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter Then  'stop
                            'Die Einheit stopt
                            Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    Else
                        If MoveAnimationFrames <= 0 Then
                            If Frames <= FrameStart Then
                                'Die Einheit am Anfang Fernkaempfer
                                Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        Else
                            If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                                'Die Einheit am Anfang
                                Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            ElseIf Frames > FrameStart And Frames <= FrameStart + MoveAnimationFrames * FrameHalter Then  'move in
                                Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                                'Die Einheit laeuft rein.
                                Dim MalFrame As Integer = (MoveAnimationFrames * FrameHalter) - (Frames - FrameStart)
                                Dim Position As Point = New Point(XStart - MalFrame * MovingSteps + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            ElseIf Frames > FrameStart + MoveAnimationFrames * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter Then  'stop
                                'Die Einheit stopt
                                Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                                Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        End If
                    End If
                ElseIf Frames > KampfAnimation.KampfStart Then
                    Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                    Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                End If
                Frames += UeberlebendeEinheiten
                UeberlebendeEinheiten -= 1
            End While
        Else
            'Jetzt muessten wir nur eine Einheit malen. Z.Bsp einen TTP
            'Diese Laufen ausserdem nicht rein.
            If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                'Die Einheit am Anfang
                Dim Position As Point = EinzelUnitPosition
                If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
            End If
        End If
    End Sub 'Fertig
    Public Sub DrawFiringAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                Frames -= UeberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                        Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter), FrameHalter, 0)
                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Das Bild wird gemalt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(FireAnimationFrames, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If UeberlebendeEinheiten > Remaining Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                            If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                            'Das Bild wird gemalt
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If UeberlebendeEinheiten > Remaining Then
                                    'Zerstoerte Einheiten malen wir so
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                                Else
                                    'Einheiten die ueberleben und zurueck schissen so.
                                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                    DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                                End If
                            Else
                                'Ansonsten machen wir das so.
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    Else
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                End If
                Frames += UeberlebendeEinheiten
                UeberlebendeEinheiten -= 1
            End While
        Else
            'Wir muessen nur eine Einheit malen kommt noch.
            If Flip = False Then
                'Wie sie feuert alles in Arbeit
                If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                    If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter), FrameHalter, 0)
                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    'Das Bild wird gemalt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230

                    Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                    If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        End If
                    ElseIf Frames >= KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            intcolor = Color.FromArgb(0, 0, 0, 0)
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(FireAnimationFrames, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart Then
                        'Die Einheit am Anfang
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            If Remaining < 1 Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            End If
                        ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            If Remaining < 1 Then
                                intcolor = Color.FromArgb(0, 0, 0, 0)
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                        Dim Position As Point = EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                        'Das Bild wird gemalt
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                End If
                            ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    intcolor = Color.FromArgb(0, 0, 0, 0)
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If 1 > Remaining Then
                                'Zerstoerte Einheiten malen wir so
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            Else
                                'Einheiten die ueberleben und zurueck schissen so.
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        Else
                            'Ansonsten machen wir das so.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                Else
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                    If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        End If
                    ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            intcolor = Color.FromArgb(0, 0, 0, 0)
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Or _
                        Fernkampf = False And Einheit.KannNurFernkampf = True Or _
                        Einheit.HasNoWeapons = True Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            End If
        End If
    End Sub 'Fertig
    Public Sub DrawStandingAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If UeberlebendeEinheiten > Remaining Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim A As Integer = 0 'Hier duerften wir nie hinkommen wenn doch muss ich was aendern
                        End If
                    Else
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                End If
                UeberlebendeEinheiten -= 1
            End While
        Else
            If Flip = False Then
                If Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameAngreifer Then
                        Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                            If Frame > 10 Then Frame = 10
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart Then
                        'Die Einheit am Anfang
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If Remaining < 1 Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                If Frame > 10 Then Frame = 10
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim A As Integer = 0 'Hier duerften wir nie hinkommen wenn doch muss ich was aendern
                    End If
                Else
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameVerteidiger Then
                        Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            If Frame > 10 Then Frame = 10
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            End If
        End If
    End Sub 'Fertig 
    Public Sub DrawMovingInAndFiring(ByVal Frames As Integer, ByVal MalStart As Point)
        If Flip = True Then
            DrawFiringAnimation(Frames, MalStart)
        Else
            DrawMovingAnimation(Frames, MalStart)
            DrawFiringAnimation(Frames, MalStart)
        End If
    End Sub 'Fertig
    Public Shared Sub DrawUnit(ByVal Textur As Texture, ByVal Maske As Texture, ByVal sngrotation As Single, ByVal intcolor As Color, ByVal Spielerfarbe As Color)
        Grafikengine.Sprite.Draw2D(Textur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
        If intcolor <> Hauptmenue.NeutralFarbe Then
            intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielerfarbe, 0.5#, False)
        Else
            intcolor = Spielerfarbe
        End If
        Grafikengine.Sprite.Draw2D(Maske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
    End Sub 'Fertig
    Public Sub DrawStandingFlyingAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                'Lufteinheiten stuerzen ab. :D
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                                Position += GetAbstuerzPosition(Frame)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If UeberlebendeEinheiten > Remaining Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    Position += GetAbstuerzPosition(Frame)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim A As Integer = 0 'Hier duerften wir nie hinkommen wenn doch muss ich was aendern
                        End If
                    Else
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If UeberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                Position += GetAbstuerzPosition(Frame)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                End If
                UeberlebendeEinheiten -= 1
            End While
        Else
            If Flip = False Then
                If Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameAngreifer Then
                        Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                            Position += GetAbstuerzPosition(Frame)
                            Frame /= 2
                            If Frame > 10 Then Frame = 10
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart Then
                        'Die Einheit am Anfang
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If Remaining < 1 Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                Position += GetAbstuerzPosition(Frame)
                                Frame /= 2
                                If Frame > 10 Then Frame = 10
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim A As Integer = 0 'Hier duerften wir nie hinkommen wenn doch muss ich was aendern
                    End If
                Else
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += GetFlyingUnit(Frames)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameVerteidiger Then
                        Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                        If 1 > Remaining Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            Position += GetAbstuerzPosition(Frame)
                            Frame /= 2
                            If Frame > 10 Then Frame = 10
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHoehe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            End If
        End If
    End Sub 'Fertig 

    Public Sub DrawAnimatedStanding(ByVal MalStart As Point, ByVal Frame As Integer, ByVal Farbe As Color, ByVal Tex As Texture)

    End Sub
#End Region
#Region "Weapons"
    Public Sub DrawRakete(ByVal Frames As Integer, ByVal MalStart As Point) 'Fehlerhaft Raketen fliegen zurueck. 
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        If NumberOfUnits > 1 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                Frames -= UeberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= KampfAnimation.SchadensFrameVerteidiger Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 12
                        Position.Y += 8 - (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 6
                        'Jetzt wird die Rakete gestartet
                        Dim Ausschnitt As Point = SetWaffenAusschnitt(0, 2, False, False, Position, 32, 16)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    ElseIf Frames > KampfAnimation.SchadensFrameVerteidiger And Frames <= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        Position.X += (Frames - KampfAnimation.SchadensFrameVerteidiger) * 12
                        Position.X += KampfAnimation.Bildbreite - 30
                        Dim Ausschnitt As New Point
                        If OpferPosition = OpferPositionen.Oben Then
                            Position.Y = 115 - (Frames - KampfAnimation.SchadensFrameVerteidiger) * 6
                            Ausschnitt = SetWaffenAusschnitt(0, 2, False, True, Position, 32, 16)
                        Else
                            Ausschnitt = SetWaffenAusschnitt(1, 2, False, True, Position, 32, 16)
                            Position.Y = 45 + (Frames - KampfAnimation.SchadensFrameVerteidiger) * 6
                        End If
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                Else
                    If Frames > FrameStart Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 12
                        Position.Y += 8 - (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 6
                        Position = FlipPoint(Position, 32)
                        'Jetzt wird die Rakete gestartet
                        Dim Ausschnitt As Point = SetWaffenAusschnitt(0, 2, Flip, False, Position, 32, 16)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                End If
                Frames += UeberlebendeEinheiten
                UeberlebendeEinheiten -= 1
            End While
        Else
            'Wir malen nur eine Einheit

        End If
    End Sub 'Fertig
    Public Sub DrawRaketenRauch(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        If NumberOfUnits > 1 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                Frames -= UeberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter + 8 Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += 0
                        Position.Y += 0
                        'Jetzt wird die Rakete gestartet
                        Dim Frame As Integer = Math.DivRem(Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter, 2, 0)
                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, 3, False, Position, 70, 50)

                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.RaketenRauch, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                Else
                End If
                Frames += UeberlebendeEinheiten
                UeberlebendeEinheiten -= 1
            End While
        Else

        End If
    End Sub 'Fertig
    Public Sub DrawBomben(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
        While UeberlebendeEinheiten > 0
            Frames -= UeberlebendeEinheiten
            If Flip = False Then
                If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= KampfAnimation.SchadensFrameVerteidiger Then
                    Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - 35) + EinzelUnitPosition
                    Dim Frame As Integer = (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter)
                    'Bomben Fallen immer nach unten
                    If Frame >= 5 * 3 Then
                        Position.Y += (Frame - 5 * 3) * 5 + 45
                    Else
                        Position.Y += 3 * Frame
                    End If
                    Position.X += 20
                    'Jetzt wird die Rakete gestartet

                    Frame /= 5

                    If Frame > 3 Then Frame = 3
                    Dim Ausschnitt As Point = SetWaffenAusschnitt(Frame, 3, False, False, Position, 16, 16)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                        Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Bomben, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    End If
                ElseIf Frames > KampfAnimation.SchadensFrameVerteidiger And Frames <= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer Then
                    Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart) + EinzelUnitPosition
                    Position.X = KampfAnimation.Bildbreite * 2 - 30 - Position.X
                    Dim Ausschnitt As New Point
                    Position.Y = 60 + (Frames - KampfAnimation.SchadensFrameVerteidiger) * 6

                    Ausschnitt = SetWaffenAusschnitt(3, 3, False, True, Position, 16, 16)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then
                        Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Bomben, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            Else
                If Frames > FrameStart Then
                    Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                    'Raketen steigen in der Regel auf und dann ab. oder?
                    Position.X += (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 12
                    Position.Y += 8 - (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 6
                    Position = FlipPoint(Position, 32)
                    'Jetzt wird die Rakete gestartet
                    Dim Ausschnitt As Point = SetWaffenAusschnitt(0, 2, Flip, False, Position, 32, 16)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                        Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Bomben, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            End If
            Frames += UeberlebendeEinheiten
            UeberlebendeEinheiten -= 1
        End While
    End Sub
    Public Sub DrawAngriffsStuff(ByVal Frames As Integer, ByVal StartFrame As Integer, ByVal MaxFrames As Integer, ByVal MalStart As Point, ByVal Textur As Texture, ByVal Bildgroesse As Size, ByVal NumberOfUnits As Integer)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim UeberlebendeEinheiten As Integer = GetUeberlebendeEinheiten(Frames)
            While UeberlebendeEinheiten > 0
                Frames -= UeberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + StartFrame) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                        Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames + StartFrame) * FrameHalter), FrameHalter, 0)
                        If Frame <= MaxFrames Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            'Das Bild wird gemalt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                        End If
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        'Hier gehen wir drauf.
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart + FrameStart * FrameHalter Then
                            'Der Gegner geht hier irgendwann drauf
                        ElseIf Frames > FrameStart + FrameStart * FrameHalter And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                            Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                            If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                            'Das Bild wird gemalt
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If UeberlebendeEinheiten > Remaining Then
                                    'Zerstoerte Einheiten malen nicht
                                Else
                                    'Einheiten die ueberleben und zurueck schissen so.
                                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart - FrameStart * FrameHalter), FrameHalter, 0)
                                    If Frame <= MaxFrames Then
                                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                        intcolor = Color.FromArgb(255, 255, 255, 255)
                                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                          Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                                    End If
                                End If
                            Else
                                'Ansonsten machen wir das so.
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart - FrameStart * FrameHalter), FrameHalter, 0)
                                If Frame <= MaxFrames Then
                                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                      Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                                End If
                            End If
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                        End If
                    Else
                        'Fernkampf kein Gegen Angriff
                    End If
                End If
                Frames += UeberlebendeEinheiten
                UeberlebendeEinheiten -= 1
            End While
        Else
            'Wir muessen nur eine Einheit malen kommt noch.
            If Flip = False Then
                'Wie sie feuert alles in Arbeit
                If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FrameStart) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                    If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames + FrameStart) * FrameHalter), FrameHalter, 0)
                    If Frame <= MaxFrames Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Das Bild wird gemalt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                          Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                    End If
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    'Einheiten gehen drauf.
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart + FrameStart * FrameHalter Then
                        'Einheiten gehen drauf.
                    ElseIf Frames > FrameStart + FrameStart * FrameHalter And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                        Dim Position As Point = EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        If FlyingUnit Then Grafikengine.ptfPosition.X += GetFlyingUnit(Frames)
                        'Das Bild wird gemalt
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger + FrameStart * FrameHalter And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetUeberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                End If
                            ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    intcolor = Color.FromArgb(0, 0, 0, 0)
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If 1 > Remaining Then
                                'Zerstoerte Einheiten malen wir nicht
                            Else
                                'Einheiten die ueberleben und zurueck schissen so.
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart - FrameStart * FrameHalter), FrameHalter, 0)
                                If Frame <= MaxFrames Then
                                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                    Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                                End If
                            End If
                        Else
                            'Ansonsten machen wir das so.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Frame As Integer = Math.DivRem((Frames - FrameStart - FrameStart * FrameHalter), FrameHalter, 0)
                            If Frame <= MaxFrames Then
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MaxFrames, Flip, Position, Bildgroesse.Width, Bildgroesse.Height)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                Grafikengine.Draw2D(Textur, Grafikengine.ptfPosition, Grafikengine.recBild, Grafikengine.ptfRotCenter, 0, intcolor)
                            End If
                        End If
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                    End If
                Else
                    'Fernangriff keine Gegenwehr. LOL
                End If
            End If
        End If
    End Sub 'Fertig
#End Region
#End Region
#Region "Berechnungen"
    Public Shared Function FlipPoint(ByVal P As Point, ByVal Einheit As ObjektEinheit) As Point
        Return FlipX(P.X, P.Y, Einheit.EinheitenID)
    End Function
    Public Shared Function FlipPoint(ByVal P As Point, ByVal Standardbreite As Integer) As Point
        Return FlipPoint(P.X, P.Y)
    End Function
    Public Shared Function FlipPoint(ByVal X As Integer, ByVal Y As Integer) As Point
        Return New Point(Bildbreite * 2 + 4 - X, Y)
    End Function
    Public Shared Function FlipX(ByVal X As Integer, ByVal Y As Integer, ByVal Einheit As ObjektEinheit) As Point
        Return FlipX(X, Y, Einheit.EinheitenID)
    End Function
    Public Shared Function FlipX(ByVal X As Integer, ByVal Y As Integer, ByVal EinheitenID As String) As Point
        Return FlipPoint(X, Y)
    End Function

    Private Function GetUeberlebendeEinheiten(ByVal Frames As Integer) As Integer
        Dim UeberlebendeEinheiten As Integer = 0
        Dim R As Integer
        If Flip = False Then
            If Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                UeberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
                If R > 0 Then UeberlebendeEinheiten += 1
            Else
                UeberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben - Schaden), 20, R)
                If R > 0 Then UeberlebendeEinheiten += 1
            End If
        Else
            If Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                UeberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
                If R > 0 Then UeberlebendeEinheiten += 1
            Else
                UeberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben - Schaden), 20, R)
                If R > 0 Then UeberlebendeEinheiten += 1
            End If
        End If
        If UeberlebendeEinheiten > 5 Then UeberlebendeEinheiten = 5
        Return UeberlebendeEinheiten
    End Function
    Private Function GetMaxUnit() As Integer
        Dim UeberlebendeEinheiten As Integer = 0
        Dim R As Integer
        UeberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
        If R > 0 Then UeberlebendeEinheiten += 1
        Return UeberlebendeEinheiten
    End Function
    ''' <summary>
    ''' Sorgt dafuer, dass die Einheit ihre aufleuchtet, wenn sie getroffen wird.=D
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetUnitColor(ByVal Frame As Integer) As Integer
        'es sind ja nur 9 Frames da kann man das auch so schreiben
        Select Case Frame
            Case 0
                Return 240
            Case 1
                Return 225
            Case 2
                Return 210
            Case 3
                Return 195
            Case 4
                Return 180
            Case 5
                Return 195
            Case 6
                Return 180
            Case 7
                Return 195
            Case 8
                Return 210
            Case 9
                Return 225
            Case 10
                Return 240
            Case Else
                Return 255
        End Select
    End Function
    Public Function GetStandardPosition(ByVal UeberlebendeEinheiten As Integer) As Point
        Dim Position As Point = New Point(XStart + ((UeberlebendeEinheiten * 70) Mod 100), YStart - UeberlebendeEinheiten * 17) + EinzelUnitPosition
        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
        Return Position
    End Function
    ''' <summary>
    ''' Legt den Bildausschnitt fuer Einheiten fest.
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <param name="FrameMax"></param>
    ''' <param name="Flip"></param>
    ''' <param name="Position"></param>
    ''' <param name="Bildbreite"></param>
    ''' <param name="Bildhoehe"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SetBildAusschnitt(ByVal Frame As Integer, ByVal FrameMax As Integer, ByVal Flip As Boolean, ByVal Position As Point, ByVal Bildbreite As Integer, ByVal Bildhoehe As Integer) As Point
        Dim Ausschnitt As New Point(0, 0)
        Dim GesamtBildbreite As Integer = (Frame + 1) * Bildbreite
        Dim BildX As Integer = Frame * Bildbreite
        If Flip = True Then
            With Grafikengine.recBild
                .X = Frame * Bildbreite : .Width = Bildbreite
                .Y = 0 : .Height = Bildhoehe
            End With
            Dim Pos As New Point(-(Position.X - 2 * KampfAnimation.Bildbreite - 4), Position.Y)
            If Pos.X < 0 Then
                Grafikengine.recBild.X -= Pos.X
                Grafikengine.recBild.Width += Pos.X
                Ausschnitt.X += Pos.X
            End If
            If Pos.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                Grafikengine.recBild.Width -= Pos.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
            End If
            'Y Ausschnitt ist immer gleich
            If Position.Y < 0 Then
                Grafikengine.recBild.Y -= Position.Y
                Ausschnitt.Y -= Position.Y
            End If
            If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
            End If
            'jetzt wird die Textur noch gespiegelt
            Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
        Else
            Grafikengine.szfScale = Nothing
            With Grafikengine.recBild
                .X = Frame * Bildbreite : .Width = Bildbreite
                .Y = 0 : .Height = Bildhoehe
            End With
            If Position.X < 0 Then
                Grafikengine.recBild.X -= Position.X
                Grafikengine.recBild.Width += Position.X
                Ausschnitt.X -= Position.X
            End If
            If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
            End If
            'Y Ausschnitt ist immer gleich
            If Position.Y < 0 Then
                Grafikengine.recBild.Y -= Position.Y
                Ausschnitt.Y -= Position.Y
            End If
            If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
            End If
        End If

        'Breite Ueberpruefen
        If Grafikengine.recBild.Width < 0 Then
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.Width > Bildbreite Then
            Grafikengine.recBild.Width = 0
        End If
        'Hoehe ueberpruefen
        If Grafikengine.recBild.Height < 0 Then
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Height > Bildhoehe Then
            Grafikengine.recBild.Height = 0
        End If
        'X Ueberpruefen
        If Grafikengine.recBild.X > GesamtBildbreite Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.X < BildX Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        End If
        'YUeberpruefen
        If Grafikengine.recBild.Y < 0 Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Y > Bildhoehe Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        End If
        Return Ausschnitt
    End Function
    ''' <summary>
    ''' Legt den Bildausschnitt fuer Waffen fest
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <param name="FrameMax"></param>
    ''' <param name="Flip"></param>
    ''' <param name="BeimGegner"></param>
    ''' <param name="Position"></param>
    ''' <param name="Bildbreite"></param>
    ''' <param name="Bildhoehe"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function SetWaffenAusschnitt(ByVal Frame As Integer, ByVal FrameMax As Integer, ByVal Flip As Boolean, ByVal BeimGegner As Boolean, ByVal Position As Point, ByVal Bildbreite As Integer, ByVal Bildhoehe As Integer) As Point
        Dim Ausschnitt As New Point()
        Dim GesamtBildbreite As Integer = (Frame + 1) * Bildbreite
        Dim BildX As Integer = Frame * Bildbreite
        If Flip = True Then
            If BeimGegner = True Then
                Position.X += (KampfAnimation.Bildbreite + 4)
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhoehe
                End With
                If Position.X > KampfAnimation.Bildbreite * 2 + 4 Then
                    Grafikengine.recBild.X += (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Grafikengine.recBild.Width -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Ausschnitt.X -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                End If
                If Position.X - Grafikengine.recBild.Width < KampfAnimation.Bildbreite + 4 Then
                    Grafikengine.recBild.Width -= ((KampfAnimation.Bildbreite + 4) - (Position.X - Grafikengine.recBild.Width))
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
                End If
                'jetzt wird die Textur noch gespiegelt
                Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
                Ausschnitt.X += 8
            Else
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhoehe
                End With
                If Position.X > KampfAnimation.Bildbreite * 2 + 4 Then
                    Grafikengine.recBild.X += (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Grafikengine.recBild.Width -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Ausschnitt.X -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                End If
                If Position.X - Grafikengine.recBild.Width < KampfAnimation.Bildbreite + 4 Then
                    Grafikengine.recBild.Width -= ((KampfAnimation.Bildbreite + 4) - (Position.X - Grafikengine.recBild.Width))
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
                End If
                'jetzt wird die Textur noch gespiegelt
                Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
                Ausschnitt.X += 8
            End If
        Else
            If BeimGegner = True Then
                Position.X -= (KampfAnimation.Bildbreite + 4)
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhoehe
                End With
                If Position.X < Grafikengine.recBild.Width Then
                    Grafikengine.recBild.X += (Grafikengine.recBild.Width - Position.X)
                    Grafikengine.recBild.Width = Position.X
                    Ausschnitt.X -= Position.X
                End If
                If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                    Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
                End If
            Else
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhoehe
                End With
                If Position.X < 0 Then
                    Grafikengine.recBild.X -= Position.X
                    Grafikengine.recBild.Width += Position.X
                    Ausschnitt.X -= Position.X
                End If
                If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                    Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhoehe > KampfAnimation.BildHoehe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhoehe - KampfAnimation.BildHoehe
                End If
            End If
        End If
        'Breite Ueberpruefen
        If Grafikengine.recBild.Width < 0 Then
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.Width > Bildbreite Then
            Grafikengine.recBild.Width = 0
        End If
        'Hoehe ueberpruefen
        If Grafikengine.recBild.Height < 0 Then
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Height > Bildhoehe Then
            Grafikengine.recBild.Height = 0
        End If
        'X Ueberpruefen
        If Grafikengine.recBild.X > GesamtBildbreite Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.X < BildX Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        End If
        'YUeberpruefen
        If Grafikengine.recBild.Y < 0 Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Y > Bildhoehe Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        End If
        Return Ausschnitt
    End Function
    Public Shared Function GetAbstuerzPosition(ByVal Frame As Integer) As Point
        Return New Point(4 * Frame, 2 * Frame)
    End Function
    Public Shared Function GetFlyingUnit(ByVal Frame As Integer) As Integer
        Dim N As Integer = Math.DivRem(Frame, 20, 0)
        Dim R As Integer
        N = Math.DivRem(N, 2, R)
        Select Case R
            Case 0
                Return 1
            Case 1
                Return 0
        End Select
    End Function
#End Region
#Region "Einheiten"
    ''' <summary>
    ''' Stellt die Grafiken eines Kampfpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationKampfPanzer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            Else
                FireAnimationFrames = 6
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Raketenwerfer dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationRaketenwerfer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 2
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + FireAnimationFrames * FrameHalter
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawMovingInAndFiring(Frames, MalStart)
            DrawRaketenRauch(Frames, MalStart)
        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawRakete(Frames, MalStart)
        End Sub
    End Class
    ''' <summary>
    ''' Ein TTP.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationTTP
        Inherits EinheitenAnimation

        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 0
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If

        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Diese Klasse stellt eine Infanterie Animation her!
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationInfanterie
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 3
            If Waffe = 1 Then
                FireAnimationFrames = 6
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Diese Klasse stellt eine Mech Animation her!
    ''' Bazooka Bild fehlt.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationMech
        Inherits EinheitenAnimation

        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 3
            If Waffe = 1 Then
                Dim Anim As Objektverwalter.Kampfanimation = Nothing
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If Objektverwalter.AlleEinheiten(I).EinheitenID = "INF" Then
                        Anim = Objektverwalter.AlleEinheiten(I).GetKampfAnimation(Attacker.GetSpieler.Armee)
                        Exit For
                    End If
                Next
                MoveAnimation = Anim.GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Walk)
                MoveAnimationMaske = Anim.GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Walk)

                FireAnimationFrames = 6
                MoveAnimationFrames = 12
            Else
                MoveAnimationFrames = 12
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Jagdpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationJagdpanzer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            Else
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Jagdpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationSpaeher
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Raketenwerfer dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationArtillerie
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 8
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter + 25
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawMovingInAndFiring(Frames, MalStart)
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Flak dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationFlak
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 6
            Dim S As String = Attacker.GetSpieler.Armee
            Select Case OpferPosition
                Case OpferPositionen.Oben
                    FireAnimation = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
                    FireAnimationMaske = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Weapon1_Normal)
                Case Else
                    FireAnimation = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).GetTexture(Objektverwalter.Kampfanimation.Textur.Animations.Weapon2_Normal)
                    FireAnimationMaske = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).GetTextureMask(Objektverwalter.Kampfanimation.Textur.Animations.Weapon2_Normal)
            End Select
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Titanpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationTitanpanzer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 6
            If Waffe = 1 Then
                FireAnimationFrames = 5
            Else
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)

        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Missile dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationMissile
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 2
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter + 25
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawMovingInAndFiring(Frames, MalStart)
            DrawRaketenRauch(Frames, MalStart)
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            'Raketen?
            DrawRakete(Frames, MalStart)
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Bombers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationBomber
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 5
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter + 25
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawStandingFlyingAnimation(Frames, MalStart)
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            'Raketen?
            DrawBomben(Frames, MalStart)
        End Sub
    End Class
    ''' <summary>
    ''' Eine S-Bombe.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationSBombe
        Inherits EinheitenAnimation

        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawStandingFlyingAnimation(Frames, MalStart)
        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
        End Sub
    End Class
    ''' <summary>
    ''' Eine T-Flugzeug
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationTFlugzeug
        Inherits EinheitenAnimation

        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawStandingFlyingAnimation(Frames, MalStart)
        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Bombers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationZeppelin
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 5
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter + 25
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawStandingFlyingAnimation(Frames, MalStart)
        End Sub

        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            'Raketen?
            DrawBomben(Frames, MalStart)
        End Sub
    End Class

    ''' <summary>
    ''' Fuer alle Truppen wo wir nichts haben
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationDefault
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
            FireAnimationFrames = 0
            MoveAnimationFrames = 0
            StoppingFrames = 0
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
        Public Overrides Sub MalenWaffenSysteme(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
        End Sub
    End Class
#End Region
End Class

